CTmax Data
ctmax_temp_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species)) +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ctmax_lat_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = lat, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species)) +
labs(x = "Latitude",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ctmax_elev_plot = ctmax_data %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = elevation, y = ctmax)) +
geom_smooth(method = "lm", colour = "black") +
geom_point(aes(colour = species)) +
labs(x = "Elevation (m)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")
ggpubr::ggarrange(ctmax_temp_plot, ctmax_lat_plot, ctmax_elev_plot, common.legend = T, legend = "right", nrow = 1)

ctmax_data %>%
filter(str_detect(species, pattern = "skisto") |
str_detect(species, pattern = "lepto")) %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = ctmax)) +
facet_wrap(species~.) +
geom_smooth(method = "lm", colour = "black") +
geom_point() +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
filter(str_detect(species, pattern = "skisto") |
str_detect(species, pattern = "lepto")) %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
group_by(collection_date, species, collection_temp) %>%
summarise(mean_ctmax = mean(ctmax),
ctmax_sd = sd(ctmax),
ctmax_n = n(),
ctmax_se = ctmax_sd / sqrt(ctmax_n)) %>%
ggplot(aes(x = collection_temp, y = mean_ctmax, colour = species)) +
geom_smooth(method = "lm", se=F, linewidth = 2) +
geom_point(size = 2) +
geom_errorbar(aes(ymin = mean_ctmax - ctmax_se,
ymax = mean_ctmax + ctmax_se),
width = 0.3, linewidth = 1) +
labs(x = "Collection Temp. (°C)",
y = "CTmax (°C)") +
scale_colour_manual(values = skisto_cols) +
theme_matt() +
theme(legend.position = "right")

ctmax_data %>%
filter(str_detect(species, pattern = "skisto") |
str_detect(species, pattern = "lepto")) %>%
mutate(species = str_replace(species, "_", " "),
species = str_to_sentence(species)) %>%
ggplot(aes(x = collection_temp, y = size)) +
facet_wrap(species~.) +
geom_smooth(method = "lm", colour = "black") +
geom_point() +
labs(x = "Collection Temp. (°C)",
y = "Prosome Length (mm)") +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
select(elevation, collection_temp) %>%
distinct() %>%
ggplot(aes(x = elevation, y = collection_temp)) +
geom_point(size = 3) +
labs(x = "Elevation (m)",
y = "Collection Temp. (°C)") +
theme_matt()

ggplot(ctmax_data, aes(x = size, y = ctmax, colour = species)) +
facet_wrap(.~species) +
geom_point() +
theme_matt() +
theme(legend.position = "none")

ctmax_temp.model = lm(data = ctmax_data,
ctmax ~ collection_temp)
ctmax_resids = residuals(ctmax_temp.model)
ctmax_data %>%
mutate("genus" = if_else(species %in% c("Fr_1", "leptodiaptomus_minutus"), "Leptodiaptomus", "Skistodiaptomus"),
ctmax_resids = ctmax_resids) %>%
ggplot(aes(x = genus, y = ctmax_resids)) +
geom_boxplot() +
geom_point(position = position_jitter(height = 0, width = 0.05)) +
labs(x = "",
y = "CTmax Residuals") +
theme_matt()

ctmax_data %>%
mutate(group_id = paste(site, species)) %>%
ggplot(aes(x = fecundity, y = site, fill = site)) +
geom_density_ridges(bandwidth = 2,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "E", direction = -1) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
mutate(group_id = paste(site, species)) %>%
ggplot(aes(x = size, y = site, fill = site, group = group_id)) +
geom_density_ridges(bandwidth = 0.02,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "E", direction = -1) +
theme_matt() +
theme(legend.position = "none")

ctmax_data %>%
mutate(group_id = paste(site, species)) %>%
ggplot(aes(x = ctmax, y = site, fill = site, group = group_id)) +
geom_density_ridges(bandwidth = 0.3,
jittered_points = TRUE,
point_shape = 21,
point_size = 1,
point_colour = "grey30",
point_alpha = 0.6,
alpha = 0.9,
position = position_points_jitter(
height = 0.1, width = 0)) +
scale_fill_viridis_d(option = "E", direction = -1) +
labs(x = "CTmax (°C)") +
theme_matt() +
theme(legend.position = "none")

LS0tCnRpdGxlOiBEaWFwdG9taWQgVGhlcm1hbCBMaW1pdHMKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgICAgIHRvYzogdHJ1ZQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgZ2l0aHViX2RvY3VtZW50OgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZGVwdGg6IDMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1ULCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEYsIGVjaG8gPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IGtuaXRyOjppc19odG1sX291dHB1dCgpLAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBkZXYgPSBjKCJwbmciLCAicGRmIiksCiAgbWVzc2FnZSA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBjb2xsYXBzZSA9IFQKKQoKdGhlbWVfbWF0dCA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgZGFya190ZXh0ID0gImdyZXkyMCIpewogIG1pZF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbMl0KICBsaWdodF90ZXh0IDwtICBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZShkYXJrX3RleHQsICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gNSlbM10KICAKICBnZ3B1YnI6OnRoZW1lX3B1YnIoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDEuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gZGFya190ZXh0KSwKICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBtaWRfdGV4dCksCiAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDMsIDAsIDAsIDApLCAibW0iKSksCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gdW5pdChjKDAsIDUsIDAsIDApLCAibW0iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IDkwKSwKICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT1iYXNlX3NpemUgKiAwLjkpLAogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSAqIDAuOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwKICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMC4yNSwgMC4yNSwgMC4yNSwgMC4yNSwiY20iKQogICAgKQp9Cgp0aGVtZV9tYXR0X2ZhY2V0cyA9IGZ1bmN0aW9uKGJhc2Vfc2l6ZSA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhcmtfdGV4dCA9ICJncmV5MjAiKXsKICBtaWRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzJdCiAgbGlnaHRfdGV4dCA8LSAgbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoZGFya190ZXh0LCAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDUpWzNdCiAgCiAgdGhlbWVfYncoYmFzZV9mYW1pbHk9InNhbnMiKSAlK3JlcGxhY2UlIAogICAgdGhlbWUoCiAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmJhY2tncm91bmQgID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksIAogICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IG1pZF90ZXh0LCBsaW5laGVpZ2h0ID0gMS4xKSwKICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMywgMCwgMCwgMCksICJtbSIpKSwKICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAxLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSB1bml0KGMoMCwgNSwgMCwgMCksICJtbSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gOTApLAogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPWJhc2Vfc2l6ZSAqIDAuOSksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMC45LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLAogICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLjI1LCAwLjI1LCAwLjI1LCAwLjI1LCJjbSIpCiAgICApCn0KYGBgCgojIyBTaXRlIE1hcAoKYGBge3Igc2FtcGxlZC1zaXRlcywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9CmNvb3JkcyA9IHNpdGVfZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KHNpdGUsIGxvbmcsIGxhdCwgY29sbGVjdGlvbl90ZW1wKSAlPiUKICBkcm9wX25hKGNvbGxlY3Rpb25fdGVtcCkgJT4lIAogIGRpc3RpbmN0KCkKCm1hcF9kYXRhKCJ3b3JsZCIpICU+JSAKICBmaWx0ZXIocmVnaW9uICVpbiUgYygiVVNBIiwgIkNhbmFkYSIpKSAlPiUgCiAgZ2dwbG90KCkgKyAKICBnZW9tX3BvbHlnb24oYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9ICJsaWdodGdyZXkiKSArIAogIGNvb3JkX21hcCh4bGltID0gYygtMTEwLC02MCksCiAgICAgICAgICAgIHlsaW0gPSBjKDI1LCA1NSkpICsgCiAgZ2VvbV9wb2ludChkYXRhID0gY29vcmRzLAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgY29sb3VyID0gY29sbGVjdGlvbl90ZW1wKSwKICAgICAgICAgICAgIHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfYyhvcHRpb24gPSAiRiIpICsgCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIAogICAgICAgeSA9ICJMYXRpdHVkZSIsCiAgICAgICBjb2xvdXIgPSAiVGVtcC4iKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCmBgYAoKIyMgQ1RtYXggRGF0YSAKCmBgYHtyIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD02fQpjdG1heF90ZW1wX3Bsb3QgPSBjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoc3BlY2llcyA9IHN0cl9yZXBsYWNlKHNwZWNpZXMsICJfIiwgIiAiKSwKICAgICAgICAgc3BlY2llcyA9IHN0cl90b19zZW50ZW5jZShzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGNvbGxlY3Rpb25fdGVtcCwgeSA9IGN0bWF4KSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiYmxhY2siKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGxhYnMoeCA9ICJDb2xsZWN0aW9uIFRlbXAuICjCsEMpIiwgCiAgICAgICB5ID0gIkNUbWF4ICjCsEMpIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpjdG1heF9sYXRfcGxvdCA9IGN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbGF0LCB5ID0gY3RtYXgpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJibGFjayIpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gc3BlY2llcykpICsgCiAgIGxhYnMoeCA9ICJMYXRpdHVkZSIsIAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBza2lzdG9fY29scykgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQoKY3RtYXhfZWxldl9wbG90ID0gY3RtYXhfZGF0YSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBlbGV2YXRpb24sIHkgPSBjdG1heCkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBzcGVjaWVzKSkgKwogIGxhYnMoeCA9ICJFbGV2YXRpb24gKG0pIiwgCiAgICAgICB5ID0gIkNUbWF4ICjCsEMpIikgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gc2tpc3RvX2NvbHMpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmdncHVicjo6Z2dhcnJhbmdlKGN0bWF4X3RlbXBfcGxvdCwgY3RtYXhfbGF0X3Bsb3QsIGN0bWF4X2VsZXZfcGxvdCwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJyaWdodCIsIG5yb3cgPSAxKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KY3RtYXhfZGF0YSAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3Qoc3BlY2llcywgcGF0dGVybiA9ICJza2lzdG8iKSB8IAogICAgICAgICAgIHN0cl9kZXRlY3Qoc3BlY2llcywgcGF0dGVybiA9ICJsZXB0byIpKSAlPiUgCiAgbXV0YXRlKHNwZWNpZXMgPSBzdHJfcmVwbGFjZShzcGVjaWVzLCAiXyIsICIgIiksCiAgICAgICAgIHNwZWNpZXMgPSBzdHJfdG9fc2VudGVuY2Uoc3BlY2llcykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjb2xsZWN0aW9uX3RlbXAsIHkgPSBjdG1heCkpICsgCiAgZmFjZXRfd3JhcChzcGVjaWVzfi4pICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KCkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIsCiAgICAgICB5ID0gIkNUbWF4ICjCsEMpIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9CmN0bWF4X2RhdGEgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KHNwZWNpZXMsIHBhdHRlcm4gPSAic2tpc3RvIikgfCAKICAgICAgICAgICBzdHJfZGV0ZWN0KHNwZWNpZXMsIHBhdHRlcm4gPSAibGVwdG8iKSkgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ3JvdXBfYnkoY29sbGVjdGlvbl9kYXRlLCBzcGVjaWVzLCBjb2xsZWN0aW9uX3RlbXApICU+JSAKICBzdW1tYXJpc2UobWVhbl9jdG1heCA9IG1lYW4oY3RtYXgpLAogICAgICAgICAgICBjdG1heF9zZCA9IHNkKGN0bWF4KSwKICAgICAgICAgICAgY3RtYXhfbiA9IG4oKSwgCiAgICAgICAgICAgIGN0bWF4X3NlID0gY3RtYXhfc2QgLyBzcXJ0KGN0bWF4X24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gbWVhbl9jdG1heCwgY29sb3VyID0gc3BlY2llcykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2U9RiwgbGluZXdpZHRoID0gMikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX2N0bWF4IC0gY3RtYXhfc2UsIAogICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuX2N0bWF4ICsgY3RtYXhfc2UpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjMsIGxpbmV3aWR0aCA9IDEpICsgCiAgbGFicyh4ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiLAogICAgICAgeSA9ICJDVG1heCAowrBDKSIpICsgCiAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHNraXN0b19jb2xzKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmN0bWF4X2RhdGEgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KHNwZWNpZXMsIHBhdHRlcm4gPSAic2tpc3RvIikgfCAKICAgICAgICAgICBzdHJfZGV0ZWN0KHNwZWNpZXMsIHBhdHRlcm4gPSAibGVwdG8iKSkgJT4lIAogIG11dGF0ZShzcGVjaWVzID0gc3RyX3JlcGxhY2Uoc3BlY2llcywgIl8iLCAiICIpLAogICAgICAgICBzcGVjaWVzID0gc3RyX3RvX3NlbnRlbmNlKHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY29sbGVjdGlvbl90ZW1wLCB5ID0gc2l6ZSkpICsgCiAgZmFjZXRfd3JhcChzcGVjaWVzfi4pICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KCkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wLiAowrBDKSIsCiAgICAgICB5ID0gIlByb3NvbWUgTGVuZ3RoIChtbSkiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7cn0KY3RtYXhfZGF0YSAlPiUgCiAgc2VsZWN0KGVsZXZhdGlvbiwgY29sbGVjdGlvbl90ZW1wKSAlPiUgCiAgZGlzdGluY3QoKSAlPiUgCmdncGxvdChhZXMoeCA9IGVsZXZhdGlvbiwgeSA9IGNvbGxlY3Rpb25fdGVtcCkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGxhYnMoeCA9ICJFbGV2YXRpb24gKG0pIiwgCiAgICAgICB5ID0gIkNvbGxlY3Rpb24gVGVtcC4gKMKwQykiKSArIAogIHRoZW1lX21hdHQoKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoY3RtYXhfZGF0YSwgYWVzKHggPSBzaXplLCB5ID0gY3RtYXgsIGNvbG91ciA9IHNwZWNpZXMpKSArIAogIGZhY2V0X3dyYXAoLn5zcGVjaWVzKSArIAogIGdlb21fcG9pbnQoKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7cn0KY3RtYXhfdGVtcC5tb2RlbCA9IGxtKGRhdGEgPSBjdG1heF9kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgIGN0bWF4IH4gY29sbGVjdGlvbl90ZW1wKQoKY3RtYXhfcmVzaWRzID0gcmVzaWR1YWxzKGN0bWF4X3RlbXAubW9kZWwpCgpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoImdlbnVzIiA9IGlmX2Vsc2Uoc3BlY2llcyAlaW4lIGMoIkZyXzEiLCAibGVwdG9kaWFwdG9tdXNfbWludXR1cyIpLCAiTGVwdG9kaWFwdG9tdXMiLCAiU2tpc3RvZGlhcHRvbXVzIiksIAogICAgICAgICBjdG1heF9yZXNpZHMgPSBjdG1heF9yZXNpZHMpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBnZW51cywgeSA9IGN0bWF4X3Jlc2lkcykpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKGhlaWdodCA9IDAsIHdpZHRoID0gMC4wNSkpICsgCiAgbGFicyh4ID0gIiIsIAogICAgICAgeSA9ICJDVG1heCBSZXNpZHVhbHMiKSArIAogIHRoZW1lX21hdHQoKQpgYGAKCgpgYGB7ciBmZWN1bmRpdHktcmlkZ2VzfQpjdG1heF9kYXRhICU+JSAKICAgIG11dGF0ZShncm91cF9pZCA9IHBhc3RlKHNpdGUsIHNwZWNpZXMpKSAlPiUgCmdncGxvdChhZXMoeCA9IGZlY3VuZGl0eSwgeSA9IHNpdGUsIGZpbGwgPSBzaXRlKSkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGJhbmR3aWR0aCA9IDIsCiAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXJlZF9wb2ludHMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gMjEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvbG91ciA9ICJncmV5MzAiLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuOSwKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcigKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4xLCB3aWR0aCA9IDApKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJFIiwgZGlyZWN0aW9uID0gLTEpICsgCiAgdGhlbWVfbWF0dCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyIHNpemUtcmlkZ2VzfQpjdG1heF9kYXRhICU+JSAKICBtdXRhdGUoZ3JvdXBfaWQgPSBwYXN0ZShzaXRlLCBzcGVjaWVzKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHNpemUsIHkgPSBzaXRlLCBmaWxsID0gc2l0ZSwgZ3JvdXAgPSBncm91cF9pZCkpICsgCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhiYW5kd2lkdGggPSAwLjAyLAogICAgICAgICAgICAgICAgICAgICAgaml0dGVyZWRfcG9pbnRzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9IDIxLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb2xvdXIgPSAiZ3JleTMwIiwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDAuMSwgd2lkdGggPSAwKSkgKyAKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiRSIsIGRpcmVjdGlvbiA9IC0xKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7ciBjdG1heC1yaWRnZXN9CmN0bWF4X2RhdGEgJT4lIAogIG11dGF0ZShncm91cF9pZCA9IHBhc3RlKHNpdGUsIHNwZWNpZXMpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gY3RtYXgsIHkgPSBzaXRlLCBmaWxsID0gc2l0ZSwgZ3JvdXAgPSBncm91cF9pZCkpICsgCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhiYW5kd2lkdGggPSAwLjMsCiAgICAgICAgICAgICAgICAgICAgICBqaXR0ZXJlZF9wb2ludHMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gMjEsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvbG91ciA9ICJncmV5MzAiLAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuOSwKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcigKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4xLCB3aWR0aCA9IDApKSArIAogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJFIiwgZGlyZWN0aW9uID0gLTEpICsgCiAgbGFicyh4ID0gIkNUbWF4ICjCsEMpIikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAo=